package thread_test;

import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockDemo {
    public static int count = 0;
    public static void main(String[] args) throws InterruptedException {
        // 创建 ReentrantLock 对象,用来进行加锁操作
        ReentrantLock reentrantLock = new ReentrantLock();
        Thread t1 = new Thread(()->{
            for (int i = 0; i < 50000; i++) {
                // 防止对 count 自增过程有其他线程对其进行修改,进行加锁
                // 使用 try---finally 套住,确保 unlock 方法被执行到
                try {
                    reentrantLock.lock();
                    count++;
                }finally {
                    reentrantLock.unlock();
                }
            }
        });
        Thread t2 = new Thread(()->{
            for (int i = 0; i < 50000; i++) {
                // 防止对 count 自增过程有其他线程对其进行修改,进行加锁
                // 两个线程都要对 count++ 加锁,不然不产生锁冲突还是无法保证线程安全
                try {
                    reentrantLock.lock();
                    count++;
                }finally {
                    reentrantLock.unlock();
                }
            }
        });
        // 启动 t1 和 t2 线程
        t1.start();
        t2.start();
        // 等待 t1 和 t2 线程执行完毕
        t1.join();
        t2.join();
        // 打印最终结果
        System.out.println("count = " + count);
    }
}
